package com.wufeng.mycode;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * CAS,Compare And Swap,它是一条CPU并发原语。不会
 * atomicInteger.getAndIncrement() -> unsafe.getAndAddInt()
 * 原子类 调用 getAndIncrement方法时，底层调用 unsafe类的getAndAddInt方法。
 * unsafe类（rt.jar中的原生类，sun.misc.Unsafe）的方法是native方法,调用的UnSafe类中CAS方法，JVM会帮我们实现出CAS汇编指令。
 * 原语属于操作系统用语范畴，是由若干条指令组成的，用于完成某个功能的一个过程，并且原语的执行必须是连续的，在执行过程中不允许被中断，
 * 也就是说CAS是一条CPU的原子指令，不会造成所谓的数据不一致问题。
 * <p>
 * getAndAddInt(this,valueOffset,1) 1、当前对象2、内存偏移量（对象的内存地址）3、加的值
 * 根据 1、2参数获取到主内存的值复制到工作内存，然后判断工作内存的值与主内存值比较，相等修改值然后刷新到主内存，不相等就去去主内存的值，
 * 再去比较工作内存的值和主内存的值比较,自循环，自旋
 *
 * 原子类，CAS相比于 synchronized加锁并发量大
 * synchronized 加锁，同一个时间只有一个线程操作
 */
public class CASDemo {
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(100);
        System.out.println(atomicInteger.compareAndSet(100, 2020) + "\t " + atomicInteger.get());
        System.out.println(atomicInteger.compareAndSet(100, 2019) + "\t " + atomicInteger.get());
        atomicInteger.getAndIncrement();
    }

}
